Add *.get_all_records to XenAPI, make use of this for xm list
authorTom Wilkie <tom.wilkie@gmail.com>
Mon, 16 Apr 2007 21:58:12 +0000 (22:58 +0100)
committerTom Wilkie <tom.wilkie@gmail.com>
Mon, 16 Apr 2007 21:58:12 +0000 (22:58 +0100)
signed-off-by: Tom Wilkie <tom.wilkie@gmail.com>

tools/python/xen/xend/XendAPI.py
tools/python/xen/xm/main.py

index 3593444bd50e8c359bfe9e95215c4d17fbd3cf5c..9e5a8d0f69ea0717b3c8d9ad03b5a636bbadc47c 100644 (file)
@@ -575,15 +575,25 @@ class XendAPI(object):
             
             get_by_uuid = '%s_get_by_uuid' % api_cls
             get_uuid = '%s_get_uuid' % api_cls
+            get_all_records = '%s_get_all_records' % api_cls    
+
             def _get_by_uuid(_1, _2, ref):
                 return xen_api_success(ref)
 
             def _get_uuid(_1, _2, ref):
                 return xen_api_success(ref)
 
+            def unpack(v):
+                return v['Value']
+
+            def _get_all_records(_api_cls):
+                return lambda s, session: \
+                    xen_api_success([unpack(getattr(cls, '%s_get_record' % _api_cls)(s, session, ref))\
+                                     for ref in unpack(getattr(cls, '%s_get_all' % _api_cls)(s, session))])
+
             setattr(cls, get_by_uuid, _get_by_uuid)
             setattr(cls, get_uuid,    _get_uuid)
-
+            setattr(cls, get_all_records, _get_all_records(api_cls))
 
         # Autoplugging classes
         # --------------------
@@ -721,7 +731,7 @@ class XendAPI(object):
     Base_attr_ro = ['uuid']
     Base_attr_rw = []
     Base_methods = [('get_record', 'Struct')]
-    Base_funcs   = [('get_all', 'Set'), ('get_by_uuid', None)]
+    Base_funcs   = [('get_all', 'Set'), ('get_by_uuid', None), ('get_all_records', 'Set')]
 
     # Xen API: Class Session
     # ----------------------------------------------------------------
index 969cf609ac19445180cefb7575a7ff9803d56a2b..f91dd6ca5cac1af41a07f42ee01eec90d62a2fe8 100644 (file)
@@ -741,11 +741,12 @@ def getDomains(domain_names, state, full = 0):
     if serverType == SERVER_XEN_API:
         doms_sxp = []
         doms_dict = []
-        dom_refs = server.xenapi.VM.get_all()
-        for dom_ref in dom_refs:
-            dom_rec = server.xenapi.VM.get_record(dom_ref)
-            dom_metrics_ref = server.xenapi.VM.get_metrics(dom_ref)
-            dom_metrics = server.xenapi.VM_metrics.get_record(dom_metrics_ref)
+
+        dom_recs = server.xenapi.VM.get_all_records()
+        dom_metrics_recs = dict(map(lambda x: (x['uuid'], x), server.xenapi.VM_metrics.get_all_records()))
+
+        for dom_rec in dom_recs:
+            dom_metrics  = dom_metrics_recs[dom_rec['metrics']]
 
             states = ('running', 'blocked', 'paused', 'shutdown',
                       'crashed', 'dying')